package com.JUC.cha09.sec05;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.LongAccumulator;
import java.util.concurrent.atomic.LongAdder;
import java.util.function.LongBinaryOperator;

/**
 * 原子操作增强类原理深度解析
 * LongAdder ：创建一个初始总和为0的新加法器
 * LongAccumulator：使用给定的累加器函数和标识元素创建新实例。
 * 比较：2比1更强大，计算方法更多，自定义起始值
 */
public class LongAdderAPIDemo {

    public static void main(String[] args) {

        LongAdder longAdder = new LongAdder();
        LongAccumulator longAccumulator = new LongAccumulator(new LongBinaryOperator() {
            @Override
            public long applyAsLong(long left, long right) {
                return left + right;
            }
        }, 5);

/*        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                longAdder.increment();
            }, String.valueOf(i)).start();
        }
        System.out.println(longAdder.sum());

        longAdder.increment();
        longAdder.increment();
        longAdder.increment();

        // 暂停几秒钟线程
        try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }

        System.out.println(longAdder.sum());*/

        longAccumulator.accumulate(1);
        longAccumulator.accumulate(3);

        System.out.println(longAccumulator.get());
    }
}
